﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using AudiPyme.BLL;
using System.Diagnostics;
using System.Threading;
using Microsoft.Reporting.WebForms;
using System.Web.UI.HtmlControls;

namespace AudiPyme.UI
{
    public partial class InformesPrincipal : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                try
                {
                    String NombreUsuario = (String)Session["nombreUsuario"];
                    int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                    if (EmpresaUsuario != 0)
                    {
                        bool hayInformesEmpresa = EmpresaInformeFactory.HayInformesEmpresa(EmpresaUsuario);
                        //Generamos las opciones de la lista de Opcinoes de la página
                        GeneraOpciones(hayInformesEmpresa);
                        //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
                        List<InstanciaTipActAmenCritTabla> LRelacionesTAACR = InstanciaTipActAmenCritTabla.RecogeInstanciasEmpresa(EmpresaUsuario);
                        GVTipActAmenCrit.DataSource = LRelacionesTAACR;
                        DataBind();
                        //Recogemos las Relaciones Tipo Activo - Vulnerabilidades de Riesgo actuales de la Empresa
                        List<InstanciaTipActVulnTabla> LRelacionesTAV = InstanciaTipActVulnTabla.RecogeInstanciasEmpresa(EmpresaUsuario);
                        GVTipActVuln.DataSource = LRelacionesTAV;
                        DataBind();
                    }
                    else
                    {
                        MuestraMensaje("No hay una empresa asociada al usuario " + NombreUsuario);
                        PnlOpciones.Visible = false;
                    }
                }
                catch (Exception e1)
                {
                    e1.ToString();
                    MuestraMensaje("Error al cargar las relaciones seleccionadas por la empresa");
                }
            }
        }

        private void GeneraOpciones(bool HayInformesEmpresa)
        {
            try
            {
                if (HayInformesEmpresa)
                {
                    //Se añade la opción de Consultar Informes
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "InformesConsultar.aspx");
                    anchor.InnerText = "Consultar Informes";
                    opc1.Controls.Add(anchor);
                    HtmlGenericControl opc2 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc2);
                    HtmlGenericControl anchor2 = new HtmlGenericControl("a");
                    anchor2.Attributes.Add("href", "InformesGestionar.aspx");
                    anchor2.InnerText = "Gestionar Informes";
                    opc2.Controls.Add(anchor2);
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al generar las opciones de la página\n");
            }
        }


        protected void Button1_Click(object sender, EventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                string validador = EmpresasFactory.EmpresaTodosDatosInforme(IdEmpresa);
                if (!validador.Equals(""))
                {
                    MuestraMensaje("No se pueden generar el informe. Falta por introducir los siguientes datos:\n" + validador);
                }
                else
                {
                    List<RiesgoActivo> MatrizRiesgos = AnalisisRiesgoNegocio.CalcularAnalisisRiesgoBaseConocimiento(IdEmpresa);
                    //Generamos la estructura del Informe
                    int IdInforme = InformesFactory.InsertaInforme("Base de conocimiento");
                    //Insertamos los valores recogidos del Algoritmo en el Análisis de Riesgos con el IdInforme generado
                    AnalisisRiesgoNegocio.InsertaAnalisisRiesgo(MatrizRiesgos, IdInforme);
                    PlanMejoraNegocio.CalcularPlanMejora(IdEmpresa, MatrizRiesgos, IdInforme);
                    GeneraInforme();
                    MuestraMensaje("Análisis de Riesgos Generado Correctamente");
                    PnlRelaciones.Visible = false;
                    CheckBox1.Checked = false;
                    PnlReport.Visible = true;
                }
            }
        }

        //Método que sirve para generar el informe de análisis de riesgos 
        private void GeneraInforme()
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa == -1)
                MuestraMensaje("No se pudo recoger la Empresa");
            else
            {
                //Recogemos el ultimo Id de Informe que ha generado la empresa
                int IdInforme = InformesFactory.UltimoIdInformeEmpresa(IdEmpresa);
                if (IdInforme != 0)
                {
                    //List<Puntos> LGraficoDatosEmpresa = ActivosEmpresaFactory.ValoresEmpresaInforme(EmpresaUsuario, IdInforme);

                    List<ActivosEmpresa> ListaPrueba = ActivosEmpresaFactory.PruebaRecogeActivosEmpresa(IdEmpresa);

                    List<DatosEmpresaInforme> LDatosEmpresa = EmpresaInformeNegocio.DatosEmpresa(IdInforme);

                    List<PuntoIntXY> LDatosEmpresaXY = EmpresaInformeNegocio.DatosEmpresaInformeXY(IdInforme);

                    List<PuntoDoubleXY> LMadDeseableXY = EmpresaInformeNegocio.MadurezDeseableEmpresaInformeXY(IdInforme);

                    List<FechasInforme> LFechas = EmpresaInformeNegocio.FechaInforme(IdInforme);

                    List<PuntoDoubleXY> LControlesNivMadurezEmpresa = ControlesEmpresaInformeNegocio.ControlesNivelMadurezEmpresaInformeXY(IdInforme);

                    //Lista de los activos de la empresa
                    List<ActivosDatosInforme> LActivosEmpresa = ActivosInformeNegocio.RecogeActivosInforme(IdInforme);

                    //Lista de los Activos por Tipo de Activo XY
                    List<PuntoIntXY> LActivosTipoXY = ActivosInformeNegocio.ActivosTipoActivoInformeXY(IdInforme);

                    //Lista de los Activos por Valor Estratégico XY
                    List<PuntoIntXY> LActivosValorXY = ActivosInformeNegocio.ActivosValorEstrategicoInformeXY(IdInforme);


                    //Lista de Activos por Coste XY
                    List<PuntoIntXY> LActivosCosteXY = ActivosInformeNegocio.ActivosCosteInformeXY(IdInforme);

                    //Lista de Controles por Dominio 1 de 2 XY
                    List<PuntoIntXY> LControlesObj1d2XY = ControlesEmpresaInformeNegocio.RecogeControlesDominioInforme1de2XY(IdInforme);
                    //Lista de Controles por Dominio 2 de 2 XY
                    List<PuntoIntXY> LControlesObj2d2XY = ControlesEmpresaInformeNegocio.RecogeControlesDominioInforme2de2XY(IdInforme);
                    //Lista de Controles de Empresa para la Tabla
                    List<ControlesEmpresaDatosInforme> LControlesTabla = ControlesEmpresaInformeNegocio.RecogeControlesInformeTabla(IdInforme);
                    //Lista de Relaciones Seleccionadas por una Empresa 1 de 2 XY
                    List<PuntoIntXY> LRelacionesEmp1de2 = EmpresaInformeNegocio.RelacionesInforme1de2XY(IdInforme);
                    //Lista de Relaciones Seleccionadas por una Empresa 2 de 2 XY
                    List<PuntoIntXY> LRelacionesEmp2de2 = EmpresaInformeNegocio.RelacionesInforme2de2XY(IdInforme);

                    //Lista para la Tabla de Análisis de Riesgo
                    List<AnalisisRiesgoDatosInforme> LAnalisRiesgoTabla = AnalisisRiesgoNegocio.RecogeAnalisRiesgoInforme(IdInforme);

                    //Lista para hacer el Plan de Mejora
                    List<PlanMejoraInforme> LPlanMejoraInforme = PlanMejoraInformeNegocio.RecogePlanMejoraInforme(IdInforme);


                    ReportDataSource dataSource = new ReportDataSource();
                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSet2";
                    dataSource.Value = ListaPrueba;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSet3";
                    dataSource.Value = LDatosEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    dataSource = new ReportDataSource();
                    dataSource.Name = "DataSetDatosEmpresaXY";
                    dataSource.Value = LDatosEmpresaXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Dataset para la fecha de la portada del informe
                    dataSource = new ReportDataSource();
                    dataSource.Name = "Fechas";
                    dataSource.Value = LFechas;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico en barra del Nivel de Madurez Actual
                    dataSource = new ReportDataSource();
                    dataSource.Name = "MadDeseableXY";
                    dataSource.Value = LMadDeseableXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico Radial del Nivel de Madurez Deseable
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesNivMadurezEmpresa";
                    dataSource.Value = LControlesNivMadurezEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Activos por Tipo de Activo
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosTipoActivoXY";
                    dataSource.Value = LActivosTipoXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);


                    //Gráfico de los Activos por Valor Estratégico
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosValorEstrategicoXY";
                    dataSource.Value = LActivosValorXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de los Activos por Coste (€)
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosCosteXY";
                    dataSource.Value = LActivosCosteXY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de los Activos
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ActivosEmpresaTabla";
                    dataSource.Value = LActivosEmpresa;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesDominio1de2XY";
                    dataSource.Value = LControlesObj1d2XY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 2 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesDominio2de2XY";
                    dataSource.Value = LControlesObj2d2XY;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Respuestas de Controles por Objetivos de Control 2 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "ControlesEmpresaInformeTabla";
                    dataSource.Value = LControlesTabla;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Relaciones de la Empresa por Tipo de Activo 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "RelacionesEmpresa1de2XY";
                    dataSource.Value = LRelacionesEmp1de2;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Gráfico de Relaciones de la Empresa por Tipo de Activo 1 de 2
                    dataSource = new ReportDataSource();
                    dataSource.Name = "RelacionesEmpresa2de2XY";
                    dataSource.Value = LRelacionesEmp2de2;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de Relaciones de Análisis de Riesgo
                    dataSource = new ReportDataSource();
                    dataSource.Name = "AnalisisRiesgoTabla";
                    dataSource.Value = LAnalisRiesgoTabla;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    //Tabla de Plan de Mejora
                    dataSource = new ReportDataSource();
                    dataSource.Name = "PlanMejoraTabla";
                    dataSource.Value = LPlanMejoraInforme;
                    ReportViewer1.LocalReport.DataSources.Add(dataSource);

                    String reportName = "rptAnalisisRiesgo.rdlc";
                    ReportViewer1.LocalReport.ReportPath = reportName;

                }
                else
                {
                    MuestraMensaje("No hay informes asociados a la Empresa. No se puede generar el Informe");
                }
            }
        }

        private int DatosEmpresa()
        {
            int IdEmpresa = -1;
            String nombreUsuario = (String)Session["nombreUsuario"];
            IdEmpresa = UsuariosFactory.EmpresaUsuario(nombreUsuario);
            if (IdEmpresa == 0)
            {
                MuestraMensaje("El usuario " + nombreUsuario + " no esta asociado a una empresa");
                return -1;
            }
            else
            {
                return IdEmpresa;
            }
        }



        protected void GVTipActAmenCrit_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                this.GVTipActAmenCrit.PageIndex = e.NewPageIndex;
                //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
                List<InstanciaTipActAmenCritTabla> LRelacionesTAACR = InstanciaTipActAmenCritTabla.RecogeInstanciasEmpresa(IdEmpresa);
                GVTipActAmenCrit.DataSource = LRelacionesTAACR;
                DataBind();
                //Recogemos las Relaciones Tipo Activo - Vulnerabilidades de Riesgo actuales de la Empresa
                List<InstanciaTipActVulnTabla> LRelacionesTAV = InstanciaTipActVulnTabla.RecogeInstanciasEmpresa(IdEmpresa);
                GVTipActVuln.DataSource = LRelacionesTAV;
                DataBind();
            }
        }

        protected void GVTipActVuln_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            int IdEmpresa = DatosEmpresa();
            if (IdEmpresa != -1)
            {
                this.GVTipActVuln.PageIndex = e.NewPageIndex;
                //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
                List<InstanciaTipActAmenCritTabla> LRelacionesTAACR = InstanciaTipActAmenCritTabla.RecogeInstanciasEmpresa(IdEmpresa);
                GVTipActAmenCrit.DataSource = LRelacionesTAACR;
                DataBind();
                //Recogemos las Relaciones Tipo Activo - Vulnerabilidades de Riesgo actuales de la Empresa
                List<InstanciaTipActVulnTabla> LRelacionesTAV = InstanciaTipActVulnTabla.RecogeInstanciasEmpresa(IdEmpresa);
                GVTipActVuln.DataSource = LRelacionesTAV;
                DataBind();
            }
        }

        protected void BtnRelMatRies_Click(object sender, EventArgs e)
        {
            try
            {
                int IdEmpresa = DatosEmpresa();
                if (IdEmpresa != -1)
                {
                    //Valida si la empresa tiene todos los elementos para poder generar el Análisis de Riesgos
                    string validador = EmpresasFactory.EmpresaTodosDatosInforme(IdEmpresa);
                    if (!validador.Equals(""))
                    {
                        MuestraMensaje("No se pueden generar el informe. Falta por introducir los siguientes datos:\n" + validador);
                    }
                    else
                    {
                        //ALGORTIMO PARA CALCULAR LA MATRIZ DE RIESGOS
                        //Creamos la Estructura Principal

                        //Comprobamos que todas los activos tienen relaciones seleccionadas a través de sus tipos de activos
                        String ListaTiposActivosSinRelaciones = AnalisisRiesgoNegocio.TienenActivosRelacionesSeleccionadas(IdEmpresa);
                        if (!ListaTiposActivosSinRelaciones.Equals(""))
                        {
                            MuestraMensaje("No todos los activos tienen relaciones seleccionadas.\nTipos de Activos de los activos sin relacionar:\n" + ListaTiposActivosSinRelaciones + "\n\nVaya a Relaciones y seleccione al menos una relación por cada tipo de activo");

                        }
                        else
                        {
                            List<RiesgoActivo> MatrizRiesgos = AnalisisRiesgoNegocio.CalculaAnalisRiesgoPorRelacionesEmpresa(IdEmpresa);
                            //Fin Calcular MatricesRiesgo
                            //Generamos la estructura del Informe
                            int IdInforme = InformesFactory.InsertaInforme("Relaciones de la empresa");
                            //Insertamos los valores recogidos del Algoritmo en el Análisis de Riesgos con el IdInforme generado
                            AnalisisRiesgoNegocio.InsertaAnalisisRiesgo(MatrizRiesgos, IdInforme);
                            PlanMejoraNegocio.CalcularPlanMejora(IdEmpresa, MatrizRiesgos, IdInforme);
                            GeneraInforme();
                            MuestraMensaje("Análisis de Riesgos Generado Correctamente");
                            PnlRelaciones.Visible = false;
                            CheckBox1.Checked = false;
                            PnlReport.Visible = true;
                        }
                    }
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al generar el informe de riesgo");
            }
        }


        private void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBox1.Checked == true)
                PnlRelaciones.Visible = true;
            else
                PnlRelaciones.Visible = false;
        }
    }
}